//树形转扁平
function flatTree(data, attr = "children") {
  //声明一个数组,存储扁平之后的数据
  let flatArr = [];
  //recursion 递归处理函数
  function recursion(arr) {
    //遍历数据
    arr.forEach((item) => {
      //判断自己是否有子节点
      if (item[attr] && item[attr].length > 0) {
        recursion(item[attr]);
        // console.log(item.children)
      }
      //过滤掉子节点属性名,避免变化之后,还有子节点
      let keys = Object.keys(item);
      keys = keys.filter((key) => key !== attr);
      //重新声明一个对象,将item对应的公共属性添加到这个对象里面
      let obj = {};
      // ['name','id','parentId']
      keys.forEach((key) => {
        obj[key] = item[key];
      });

      flatArr.push(obj);
    });
  }
  recursion(data);
  return flatArr;
}

let res = flatTree(tree);

//扁平转树形
// currentKey 当前节点的字段标识(属性名)
// parentKey 父节点的字段标识(属性名)
// childKey 子节点的字段标识(子节点的字段名,属性名)
function toTree(
  data,
  currentKey = "id",
  parentKey = "parentId",
  childKey = "children"
) {
  //储存树形数据的数组
  let treeArr = [];
  //再次声明一个函数
  function recursion(data) {
    data.forEach((item) => {
      //说明这个是一个子节点
      if (item[parentKey]) {
        //爸爸去哪儿,找父节点
        let parent = data.find((p) => p[currentKey] === item[parentKey]);
        //判断父节点是否有children属性
        if (!parent[childKey]) {
          //添加一个children属性,并且是一个空数组
          parent[childKey] = [];
        }
        parent[childKey].push(item);
      } else {
        treeArr.push(item);
      }
    });
  }
  recursion(data);
  return treeArr;
}

let tree = toTree(flatArr, "area_id", "parentarea_id", "lbw");
console.log(tree);
